/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import BaseDatos.GestorBD;
import Util.GestorErrores;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Vector;
import Util.Varios;

/**
 *
 * @author Javi
 */
public class ClienteDatSocEco implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "ClienteDatSocioEco";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Datos Socioeconómicos del Cliente";
    //Condición where
    private String sCondWhere = "";
    //Atributos de la tabla
    private int _iIdCliente;
    private Date _dFecha;
    private String _sCodProfesion;
    private String _sCodSitLaboral;
    private String _sCodActivEmp;
    private String _sCargoEmp;
    private int _iAntiguedad;
    private int _iCambiosTrabajo;
    private int _iSueldoAnuFijo;
    private int _iSueldoAnuVar;
    private int _iOtrosIngresosAnu;
    private int _iImpGastosMen;
    private int _iImpHipAlqMen;
    private int _iCoefCajaMen;
    private boolean _bViviendaPropia;
    private int _iValorVivienda;
    private boolean _bOtrasProp;
    private int _iValorOtrasProp;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        String sCondicion = "";
        //Si hay alguna condición se añade a la sentencia
        if (this.sCondWhere.compareTo("") != 0)
            sCondicion = " WHERE " + this.sCondWhere;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
//            ResultSet rs = st.executeQuery("SELECT IdCliente, Fecha, CodProfesion, CodSitLaboral, Antiguedad, CoefCajaMen FROM " + this._sNombreTabla + " ORDER BY IdCliente, Fecha");
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + sCondicion + " ORDER BY IdCliente, Fecha");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (IdCliente, Fecha," +
            " CodProfesion, CodSitLaboral, CodActivEmp, CargoEmp," +
            " Antiguedad, CambiosTrabajo, SueldoAnuFijo, SueldoAnuVar," +
            " OtrosIngresosAnu, ImpGastosMen, ImpHipAlqMen, CoefCajaMen," +
            " ViviendaPropia, ValorVivienda, OtrasProp, ValorOtrasProp) VALUES (" +
            this._iIdCliente + ", '" + Varios.dateToString (this._dFecha) + "', '" +
            _sCodProfesion + "', '" + this._sCodSitLaboral + "', '" + this._sCodActivEmp + "', '" + this._sCargoEmp + "', " +
            this._iAntiguedad + ", " + this._iCambiosTrabajo + ", " + this._iSueldoAnuFijo + ", " + this._iSueldoAnuVar + ", " +
            this._iOtrosIngresosAnu + ", " + this._iImpGastosMen + ", " + this._iImpHipAlqMen + ", " + this._iCoefCajaMen + ", " +
            Varios.booleanToInteger(this._bViviendaPropia) + ", " + this._iValorVivienda + ", " +
            Varios.booleanToInteger(this._bOtrasProp) + ", " + this._iValorOtrasProp + ")";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET CodProfesion = '" + this._sCodProfesion + "', " +
            " CodSitLaboral = '" + this._sCodSitLaboral + "', " +
            " CodActivEmp = '" + this._sCodActivEmp + "', " +
            " CargoEmp = '" + this._sCargoEmp + "', " +
            " Antiguedad = " + this._iAntiguedad + "," +
            " CambiosTrabajo = " + this._iCambiosTrabajo + "," +
            " SueldoAnuFijo = " + this._iSueldoAnuFijo + "," +
            " SueldoAnuVar = " + this._iSueldoAnuVar + "," +
            " OtrosIngresosAnu = " + this._iOtrosIngresosAnu + "," +
            " ImpGastosMen = " + this._iImpGastosMen + "," +
            " ImpHipAlqMen = " + this._iImpHipAlqMen + "," +
            " CoefCajaMen = " + this._iCoefCajaMen + "," +
            " ViviendaPropia = " + Varios.booleanToInteger(this._bViviendaPropia) + ", " +
            " ValorVivienda = " + this._iValorVivienda + "," +
            " OtrasProp = " + Varios.booleanToInteger(this._bOtrasProp) + ", " +
            " ValorOtrasProp = " + this._iValorOtrasProp +
             " WHERE IdCliente = " + this._iIdCliente + " AND Fecha='" + Varios.dateToString (this._dFecha) + "'";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra todos los registros del cliente
     */
    public boolean delete (){
        String sSQL = "DELETE FROM " + this._sNombreTabla + " WHERE " +
            " IdCliente = " + this._iIdCliente;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * Forma una condición (un AND) a partir de los valores contenidos en los atributos de la clase
     * Se utiliza en combinación con el método selectAll para restringir la selección de clientes.
     * En este caso solo se contempla el IdCliente
     * @return
     */
    public String formaCondicionWhere(){
        String sCondicion = "";
        if (_iIdCliente!= 0)
            sCondicion += " IdCliente = " + _iIdCliente;
        return sCondicion;
    }

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        if ( this._sCodProfesion.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("La profesión es obligatoria");
        if ( this._sCodSitLaboral.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("La situación laboral es obligatoria");
        if ( this._sCodActivEmp.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El código de actividad de la empresa es obligatorio");
        if ( this._sCargoEmp.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El cargo en la empresa es obligatorio");
        if ( this._iAntiguedad == 0 )
            GestorErrores.getInstancia().getvErrores().add ("La antiguedad en la empresa es obligatoria");
        if ( this._iSueldoAnuFijo == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El sueldo anual fijo es obligatorio");
        if ( this._iImpGastosMen == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El importe de los gastos mensuales es obligatorio");
        if (this._bViviendaPropia)
            if ( this._iValorVivienda == 0 )
                GestorErrores.getInstancia().getvErrores().add ("El valor de la vivienda es obligatoria");
        if (this._bOtrasProp)
            if ( this._iValorOtrasProp == 0 )
                GestorErrores.getInstancia().getvErrores().add ("El valor de las otras propiedades es obligatorio");

        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        int iIndice;
        this.inicializa();
        iIndice = Varios.getPosCadena(columnIdentifiers, "IdCliente");
        this._iIdCliente = Integer.parseInt( dataRow.get(iIndice).toString() );
        iIndice = Varios.getPosCadena(columnIdentifiers, "Fecha");
        this._dFecha = Varios.stringToDate (dataRow.get(iIndice).toString());
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();
        for (int i=0; i < columnIdentifiers.size(); i++){
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdCliente") == 0 )
                resul.add( this._iIdCliente );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Fecha") == 0 )
                resul.add( this._dFecha );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodProfesion") == 0 )
                resul.add( this._sCodProfesion );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodSitLaboral") == 0 )
                resul.add( this._sCodSitLaboral );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodActivEmp") == 0 )
                resul.add( this._sCodActivEmp );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CargoEmp") == 0 )
                resul.add( this._sCargoEmp );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Antiguedad") == 0 )
                resul.add( this._iAntiguedad );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CambiosTrabajo") == 0 )
                resul.add( this._iCambiosTrabajo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("SueldoAnuFijo") == 0 )
                resul.add( this._iSueldoAnuFijo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("SueldoAnuVar") == 0 )
                resul.add( this._iSueldoAnuVar );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("OtrosIngresosAnu") == 0 )
                resul.add( this._iOtrosIngresosAnu );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ImpGastosMen") == 0 )
                resul.add( this._iImpGastosMen );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ImpHipAlqMen") == 0 )
                resul.add( this._iImpHipAlqMen );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CoefCajaMen") == 0 )
                resul.add( this._iCoefCajaMen );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ViviendaPropia") == 0 )
                resul.add( this._bViviendaPropia );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ValorVivienda") == 0 )
                resul.add( this._iValorVivienda );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("OtrasProp") == 0 )
                resul.add( this._bOtrasProp );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("ValorOtrasProp") == 0 )
                resul.add( this._iValorOtrasProp );
        }
        return resul;
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs;
            //Primero se recupera (para el idCliente) cual es la mayor fecha que es <= que la fecha de referencia que tenemos.
            rs = st.executeQuery("SELECT MAX(Fecha) FROM " + this._sNombreTabla + " WHERE " +
            " IdCliente = " + this._iIdCliente + " AND Fecha <= '" + Varios.dateToString(this._dFecha) +
            "'");
            if ( rs.next() ) {
                //Actualizo el valor de la fecha
                this._dFecha= rs.getDate(1);
            }
            rs.close();
            //Y ahora se obtienen los datos del registro con la clave idCliente+Fecha
            rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " WHERE " +
                " IdCliente = " + this._iIdCliente + " AND Fecha='" + Varios.dateToString (this._dFecha) + "'");
            if ( rs.next() ) {
                this._sCodProfesion = rs.getString("CodProfesion");
                this._sCodSitLaboral = rs.getString("CodSitLaboral");
                this._sCodActivEmp = rs.getString("CodActivEmp");
                this._sCargoEmp = rs.getString("CargoEmp");
                this._iAntiguedad= rs.getInt("Antiguedad");
                this._iCambiosTrabajo= rs.getInt("CambiosTrabajo");
                this._iSueldoAnuFijo= rs.getInt("SueldoAnuFijo");
                this._iSueldoAnuVar= rs.getInt("SueldoAnuVar");
                this._iOtrosIngresosAnu= rs.getInt("OtrosIngresosAnu");
                this._iImpGastosMen= rs.getInt("ImpGastosMen");
                this._iImpHipAlqMen= rs.getInt("ImpHipAlqMen");
                this._iCoefCajaMen= rs.getInt("CoefCajaMen");
                this._bViviendaPropia= Varios.integerToBoolean(rs.getInt("ViviendaPropia"));
                this._iValorVivienda= rs.getInt("ValorVivienda");
                this._bOtrasProp= Varios.integerToBoolean(rs.getInt("OtrasProp"));
                this._iValorOtrasProp= rs.getInt("ValorOtrasProp");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa (){
        this._iIdCliente = 0;
        this._dFecha = new Date();  //La fecha de hoy
        this._sCodProfesion = "";
        this._sCodSitLaboral = "";
        this._sCodActivEmp = "";
        this._sCargoEmp = "";
        this._iAntiguedad = 0;
        this._iCambiosTrabajo = 0;
        this._iSueldoAnuFijo = 0;
        this._iSueldoAnuVar = 0;
        this._iOtrosIngresosAnu = 0;
        this._iImpGastosMen = 0;
        this._iImpHipAlqMen = 0;
        this._iCoefCajaMen = 0;
        this._bViviendaPropia = false;
        this._iValorVivienda = 0;
        this._bOtrasProp = false;
        this._iValorOtrasProp = 0;
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public int getiIdCliente() {
        return _iIdCliente;
    }

    public void setiIdCliente(int _iIdCliente) {
        this._iIdCliente = _iIdCliente;
    }

    public boolean isbOtrasProp() {
        return _bOtrasProp;
    }

    public void setbOtrasProp(boolean _bOtrasProp) {
        this._bOtrasProp = _bOtrasProp;
    }

    public boolean isbViviendaPropia() {
        return _bViviendaPropia;
    }

    public void setbViviendaPropia(boolean _bViviendaPropia) {
        this._bViviendaPropia = _bViviendaPropia;
    }

    public Date getdFecha() {
        return _dFecha;
    }

    public void setdFecha(Date _dFecha) {
        this._dFecha = _dFecha;
    }

    public int getiAntiguedad() {
        return _iAntiguedad;
    }

    public void setiAntiguedad(int _iAntiguedad) {
        this._iAntiguedad = _iAntiguedad;
    }

    public int getiCambiosTrabajo() {
        return _iCambiosTrabajo;
    }

    public void setiCambiosTrabajo(int _iCambiosTrabajo) {
        this._iCambiosTrabajo = _iCambiosTrabajo;
    }

    public int getiCoefCajaMen() {
        return _iCoefCajaMen;
    }

    public void setiCoefCajaMen(int _iCoefCajaMen) {
        this._iCoefCajaMen = _iCoefCajaMen;
    }

    public int getiImpGastosMen() {
        return _iImpGastosMen;
    }

    public void setiImpGastosMen(int _iImpGastosMen) {
        this._iImpGastosMen = _iImpGastosMen;
    }

    public int getiImpHipAlqMen() {
        return _iImpHipAlqMen;
    }

    public void setiImpHipAlqMen(int _iImpHipAlqMen) {
        this._iImpHipAlqMen = _iImpHipAlqMen;
    }

    public int getiOtrosIngresosAnu() {
        return _iOtrosIngresosAnu;
    }

    public void setiOtrosIngresosAnu(int _iOtrosIngresosAnu) {
        this._iOtrosIngresosAnu = _iOtrosIngresosAnu;
    }

    public int getiSueldoAnuFijo() {
        return _iSueldoAnuFijo;
    }

    public void setiSueldoAnuFijo(int _iSueldoAnuFijo) {
        this._iSueldoAnuFijo = _iSueldoAnuFijo;
    }

    public int getiSueldoAnuVar() {
        return _iSueldoAnuVar;
    }

    public void setiSueldoAnuVar(int _iSueldoAnuVar) {
        this._iSueldoAnuVar = _iSueldoAnuVar;
    }

    public int getiValorOtrasProp() {
        return _iValorOtrasProp;
    }

    public void setiValorOtrasProp(int _iValorOtrasProp) {
        this._iValorOtrasProp = _iValorOtrasProp;
    }

    public int getiValorVivienda() {
        return _iValorVivienda;
    }

    public void setiValorVivienda(int _iValorVivienda) {
        this._iValorVivienda = _iValorVivienda;
    }

    public String getsCargoEmp() {
        return _sCargoEmp;
    }

    public void setsCargoEmp(String _sCargoEmp) {
        this._sCargoEmp = _sCargoEmp;
    }

    public String getsCodActivEmp() {
        return _sCodActivEmp;
    }

    public void setsCodActivEmp(String _sCodActivEmp) {
        this._sCodActivEmp = _sCodActivEmp;
    }

    public String getsCodProfesion() {
        return _sCodProfesion;
    }

    public void setsCodProfesion(String _sCodProfesion) {
        this._sCodProfesion = _sCodProfesion;
    }

    public String getsCodSitLaboral() {
        return _sCodSitLaboral;
    }

    public void setsCodSitLaboral(String _sCodSitLaboral) {
        this._sCodSitLaboral = _sCodSitLaboral;
    }

    public int calculaCoefCajaMen(){
        return ( (this._iSueldoAnuFijo + this._iSueldoAnuVar + this._iOtrosIngresosAnu)/12 -
                (this._iImpHipAlqMen + this._iImpGastosMen) );
    }

    public String getsCondWhere() {
        return sCondWhere;
    }

    public void setsCondWhere(String sCondWhere) {
        this.sCondWhere = sCondWhere;
    }
}
